#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "Globales.h"
#include "TDiccionario.h"
#include "TLista.h"

#define CANT_INICIAL 4
#define ERROR_ALOCAR_MEMORIA -1
#define ERROR 2
#define CRECIMIENTO_ARRAY 16

int TDiccionario_Crear(TDiccionario** td) {
  int iError = 0;
  TDiccionario xTweetAux;
  *td = malloc(sizeof(TDiccionario));
  TLista_Crear(&(xTweetAux.m_xLista), sizeof(TClave_Valor));
  memcpy(*td, &xTweetAux, sizeof(TDiccionario));
  return iError;
}

int TDiccionario_Destruir(TDiccionario** td) {
  int iError;
  free(*td);
  return iError;
}

int TDiccionario_colocar(TDiccionario* td, char* clave, char* valor){
  int iError = 0;
  TClave_Valor* elemento;

  elemento = (TClave_Valor*)malloc(sizeof(TClave_Valor));
  strcpyMem(&(elemento->m_szClave), clave);
  if (valor != NULL) {
    strcpyMem(&(elemento->m_szValor), valor);
  }
  TLista_Insertar(&(td->m_xLista), LS_SIGUIENTE, elemento);
  strcpyMem(&(elemento->m_szClave), "");
  strcpyMem(&(elemento->m_szValor), "");
  return iError;
}

int TDiccionario_sizeDato(TDiccionario* td, char* clave){
  int iTamanio = 0;
  TClave_Valor xClaveValor;
  char* szNombreClave;

  TLista_MoverCorriente(&(td->m_xLista), LS_PRIMERO);
  TLista_ElemCorriente(td->m_xLista, &xClaveValor);
  strcpyMem(&szNombreClave, xClaveValor.m_szClave);
  while (strcmp(szNombreClave, clave) != 0) {
    TLista_MoverCorriente(&(td->m_xLista), LS_SIGUIENTE);
    TLista_ElemCorriente(td->m_xLista, &xClaveValor);
    strcpyMem(&szNombreClave, xClaveValor.m_szClave);
  }
  strcpyMem(&szNombreClave, xClaveValor.m_szValor);
  iTamanio = strlen(szNombreClave);
  strcpyMem(&szNombreClave, "");
  return iTamanio;
}

int TDiccionario_obtener(TDiccionario* td, char* clave, char* buffer){
  int iError = 0;
  TClave_Valor xClaveValor;
  char* szNombreClave;
  TLista_MoverCorriente(&(td->m_xLista), LS_PRIMERO);
  TLista_ElemCorriente(td->m_xLista, &xClaveValor);
  strcpyMem(&szNombreClave, xClaveValor.m_szClave);
  while (strcmp(szNombreClave, clave) != 0) {
    TLista_MoverCorriente(&(td->m_xLista), LS_SIGUIENTE);
    TLista_ElemCorriente(td->m_xLista, &xClaveValor);
    strcpyMem(&szNombreClave, xClaveValor.m_szClave);
  }
  strcpy(buffer, xClaveValor.m_szValor);
  return iError;
}

